package com.mdxl.first.Dao;

import java.util.List;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mdxl.first.exception.ServiceException;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteResult;

public interface IMongoDAO {

	/**
	 * save(新增)
	 * @param model
	 * @param json
	 * @return
	 * @throws Exception
	 *             String
	 * @exception
	 * @since 1.0.0
	 */
	public JSONObject save(String model, String json) throws ServiceException;

	public JSONObject save(String model, JSONArray list) throws ServiceException ;

	/**
	 * delete(删除)
	 * @param model
	 * @param id
	 * @return String
	 * @exception
	 * @since 1.0.0
	 */
	public JSONObject delete(String model, String id) throws ServiceException;

	/**
	 * update(更新)
	 * @param model
	 * @param json
	 * @param id
	 * @return String
	 * @exception
	 * @since 1.0.0
	 */
	public JSONObject update(String model, String json, String id) throws ServiceException;
	
	public JSONObject updateUnset(String model, String json, String id) ;

	/**
	 * inc(自增长)
	 * @param model
	 * @param json
	 * @param id
	 * @return String
	 * @exception
	 * @since 1.0.0
	 */
	public JSONObject inc(String model, String json, String id) throws ServiceException;
	
	/**
	 * 批量自增长
	 * @param model
	 * @param json
	 * @param condition
	 * @return
	 * @throws ServiceException
	 */
	public JSONObject batchInc(String model, String json, JSONObject condition) throws ServiceException;
	
	/**
	 * 聚合函数
	 * @param model 表
	 * @param query 查询条件
	 * @param sort 排序
	 * @param skip 分页
	 * @param limit 分页
	 * @return
	 * @throws Exception
	 */
	public JSONArray aggregate(String model, String query, String sort, int skip, int limit) throws Exception ;
	/**
	 * 聚合函数
	 * aggregate:
	 * @author sid
	 * @param model
	 * @param conditions
	 * 通过管道操作；具体可用管道如下：
	 * $project：修改输入文档的结构。可以用来重命名、增加或删除域，也可以用于创建计算结果以及嵌套文档。
	 * $match：用于过滤数据，只输出符合条件的文档。$match使用MongoDB的标准查询操作。
	 * $limit：用来限制MongoDB聚合管道返回的文档数。
	 * $skip：在聚合管道中跳过指定数量的文档，并返回余下的文档。
	 * $unwind：将文档中的某一个数组类型字段拆分成多条，每条包含数组中的一个值。
	 * $group：将集合中的文档分组，可用于统计结果。
	 * $sort：将输入文档排序后输出。
	 * $geoNear：输出接近某一地理位置的有序文档。
	 * 下面是表达式内的可以函数
	 * $sum、$avg、$min、$max、$push、$addToSet、$first、$last
	 * @return
	 * @throws Exception
	 */
	public JSONArray aggregate(String model, List<String> conditions) ;
	/**
	 * 聚合函数
	 * @param model
	 * @param pipeline
	 * @return
	 * @throws Exception
	 */
	public JSONArray aggregate(String model, String pipeline) throws Exception;
	
	/**
	 * get(按id查找)
	 * @param model
	 * @param id
	 * @return String
	 * @exception
	 * @since 1.0.0
	 */
	public String get(String model, String id) throws ServiceException;

	/**
	 * find(高级查询)
	 * @param query
	 *            查询条件
	 * @param fields
	 *            返回字段
	 * @param orderBy
	 *            排序条件
	 * @param model
	 *            查询模型
	 * @param numToSkip
	 *            跳过条数
	 * @param batchSize
	 *            返回条数
	 * @return List<DBObject>
	 * @exception
	 * @since 1.0.0
	 */
	public DBObject find(String where, String fields, String orderBy, String model, int skip, int size) ;
	/**
	 * find(高级查询)
	 * @param query
	 *            查询条件
	 * @param fields
	 *            返回字段
	 * @param orderBy
	 *            排序条件
	 * @param model
	 *            查询模型
	 * @return List<DBObject>
	 * @exception
	 * @since 1.0.0
	 */
	public DBObject find(String where, String fields, String orderBy, String model) ;

	/**
	 * distinct(高级查询)
	 * @param query
	 *            查询条件
	 * @param fieldName
	 *            指定字段
	 * @param model
	 *            查询模型
	 * @return List<DBObject>
	 * @exception
	 * @since 1.0.0
	 */
	public List<?> distinct(String query, String fieldName, String model) ;

	/**
	 * eval(在mongo Server上执行js函数)
	 * @param function
	 * @param args
	 * @return String
	 * @exception
	 * @since 1.0.0
	 */
	public String eval(String function, String json) ;
	
	/**
	 * 原子修改操作
	 * @param model
	 * @param where
	 * @param update
	 * @param returnNew true返回修改后数据,false 返回修改前的数据
	 * @param upsert true 修改的记录不存在则新增一条
	 * @return
	 */
	public JSONObject findAndModify(String model, String where, String update, boolean returnNew, boolean upsert);

	/**
	 * 插入
	 * @param model
	 *            集合名
	 * @param obj
	 *            新文档
	 */

	public WriteResult insert(String model, DBObject obj) ;

	/**
	 * 查询
	 * @param model
	 *            集合名
	 * @param obj
	 *            条件文档
	 * @return DBCursor 游标
	 */
	public DBCursor find(String model, DBObject obj) ;

	/**
	 * 查询unique
	 * 
	 * @param collection
	 *            集合名
	 * @param obj
	 *            条件文档
	 * @return DBObject 文档对象
	 */
	public DBObject findOne(String model, DBObject obj) ;

	/**
	 * 查询
	 * 
	 * @param model
	 *            集合名
	 * @param key
	 *            查询条件键
	 * @param value
	 *            查询条件值
	 * @return DBCursor 游标
	 */
	public DBCursor find(String model, String key, String value) ;
	
	public DBCursor find(String model, String key, Object value) ;

	/**
	 * 查询unique
	 * 
	 * @param model
	 *            集合名
	 * @param key
	 *            查询条件键
	 * @param value
	 *            查询条件值
	 * @return DBObject 文档对象
	 */
	public DBObject findOne(String model, String key, String value) ;

	public JSONObject updateByCondition(String model, String json, String condition);
	
}
